package gc;

/**
 * @author LIBOFEI
 * @ClassName FinalizeEscapeGc
 * @description  对象可以在GC回收时自我拯救
 *               这种自救的机会只有一次，，因为一个对象的finalize()方法最多只会被系统调用一次
 *
 *               不推荐使用这种方法拯救对象
 * @date 2020/10/20 15:37
 * @Version 1.0
 **/
public class FinalizeEscapeGc {

    public  static  FinalizeEscapeGc SAVE_HOOK = null;

    public void isAlive(){
        System.out.println("我还活着");
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize方法() 执行");
        FinalizeEscapeGc.SAVE_HOOK = this;
    }

    public static void main(String[] args) throws InterruptedException {

        SAVE_HOOK = new FinalizeEscapeGc();

        //对象第一次自救
        SAVE_HOOK = null;
        System.gc();
        //因为finalize方法优先级低，所以暂停0.5秒等待它
        Thread.sleep(500);
        if(SAVE_HOOK != null){
            SAVE_HOOK.isAlive();
        }else{
            System.out.println("对象已死，有事烧纸");
        }

        //对象第二次自救
        SAVE_HOOK = null;
        System.gc();
        //因为finalize方法优先级低，所以暂停0.5秒等待它
        Thread.sleep(500);
        if(SAVE_HOOK != null){
            SAVE_HOOK.isAlive();
        }else{
            System.out.println("对象已死，有事烧纸");
        }
    }
}
